<?php

declare(strict_types=1);

namespace app\common\traits;

/**
 * 树型表公共方法
 * @author:kaige
 * @update:2022-10-21
 * @copyright ©2022 泉州市盛筑信息科技有限公司 版权所有
 */
trait TreeServiceTrait
{
    /**
     * 预先判断死循环
     * @param int $id   当前id
     * @param int $pid  预挂载的父id
     * @param int $n    循环次数 
     * @return bool     如果为true就是通过了，否则就是未通过
     */
    public function checkDie($id, $pid, $n = 10)
    {
        $id = (int)$id;
        $pid = (int)$pid;
        //设置计数器，防止极端情况下陷入死循环了（其他地方如果设置的有问题死循环的话，这里就报错了）
        if ($n <= 0) {
            return false;
        }
        if ($id == $pid) {
            return false;
        }
        if ($pid == 0) { //顶级
            return true;
        }
        $pinfo = $this->dao->getInfoById($pid);
        if (!$pinfo) {
            return false;
        }
        if ($pinfo['pid'] == $id) {
            return false;
        }
        $n--;
        return $this->checkDie($id, $pinfo['pid'], $n);
    }
}
